iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0
Security

我逆向你逆向我的逆向工程膩系列 第 26

Dx26 - ASLR 保護技術 & 去除 ASLR

  • 分享至 

  • xImage
  •  

在我們利用 x64dbg 等工具調適程式的時候都會看到位置基址常常是在一些很混亂的位置,而且每次都不一樣。而這些隨機變化的位置往往會使我們在逆向工程的時候會覺得很煩,不僅每次都要重新計算,而且對於記憶體的攻擊難以實行。
https://ithelp.ithome.com.tw/upload/images/20221010/20135675rmf0VfOody.png
https://ithelp.ithome.com.tw/upload/images/20221010/20135675DAgHxlAmho.png

實際上,這項技術正是用來防止惡意軟體利用 OS 漏洞 ( 主要是 Buffer Overflow ) 來進行破壞系統的技術。名為位址空間組態隨機載入( Address space layout randomization : ASLR ) ,

這名子看起來很長很難懂,不過簡單來說就是讓基址每次都會隨機。

本次使用檔案與成品 :
https://github.com/Dinlon5566/IT_Reverse_Engineering/tree/main/Dx26

那來看看關閉 ASLR 前後的狀況會如何 :

  1. 首先,要有一份 ASLR 與沒有 ASLR 的程式,透過 Visual studio 的選項可以輕易開啟與關閉。
    https://ithelp.ithome.com.tw/upload/images/20221010/20135675JO8F13rbb3.png

  2. 這邊有了兩份程式

    • ASLR-x64.exe : 有開啟 ASLR
    • noASLR-x64.exe : 關閉 ASLR
  3. 先試著利用 x64dbg 來檢視基址的差別

    • ASLR-x64.exe : 跟以前一樣,基址是隨機的。
      https://ithelp.ithome.com.tw/upload/images/20221010/20135675H4D99JNupE.png

    • noASLR-x64.exe : 基址是 0x140000000,看著就很舒服。
      https://ithelp.ithome.com.tw/upload/images/20221010/20135675qqBiNJubjM.png

另外看一下 Option HeaderImage Base 位置,兩者都是 0X140000000。不過只有關閉 ASLR 的有確實加載在該位置上。

https://ithelp.ithome.com.tw/upload/images/20221010/20135675yQS3umZlCg.png

  1. 來靜態分析這份程式由甚麼不同,利用 PE-Bear 比對檔案

透過比對 File Header 可以看見沒有 ASLR 的程式在 Characteristic 中多出了 1 ,代表 IMAGE_FILE_RELOCS_STRIPPED,代表這份文件不包含基址重定位,因此必須加載在基址上面
https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#characteristics

https://ithelp.ithome.com.tw/upload/images/20221010/20135675vEJTJCOrAV.png

  1. Option Header 中的 DLL Characteristics 中,有 ASLR 的多了 40 ;意味著

IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE,DLL檔案可以在加載時重定位。

https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#dll-characteristics

https://ithelp.ithome.com.tw/upload/images/20221010/20135675buszs9KiWy.png

  1. 查看區塊分布,有 ASLR 的程式中多了 .reloc 這個區塊,使他載入時可以做為重定位的依據

https://ithelp.ithome.com.tw/upload/images/20221010/20135675N4wgIjsWTx.png

那以上就是有 ASLR 與 沒有 ASLR 的差別。


去除 ASLR

那了解了兩者的差異,那就來試試看把 ASLR 去除掉吧 。

首先,目標是把 DLL CharacteristicsIMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 改掉,使程式不能重定位

  1. 可以看到檔案位置 0x156 有資料 8160,去掉 40 變成 8120
    https://ithelp.ithome.com.tw/upload/images/20221010/20135675JQ31NvOHd5.png
    https://ithelp.ithome.com.tw/upload/images/20221010/20135675iF2iWuqxHI.png

然後呢 ? 然後就完成了。就是這麼簡單。

看看做完後的運行基址 :
https://ithelp.ithome.com.tw/upload/images/20221010/20135675CPlkvd0Tws.png

看到 DLL Characteristics40 被減掉後, DLL 就不能重定位了。因此會載入到 0x140000000 這個 Image Base。以上就是關於去除 ASLR 的操作說明。
https://ithelp.ithome.com.tw/upload/images/20221010/201356750iqY3rrjHN.png


上一篇
Dx25 - 寫一個 API Hook 程式
下一篇
Dx27 - 反逆向技術
系列文
我逆向你逆向我的逆向工程膩31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言